package com.fruit.sdk.account;

import com.fruit.pojo.Page;
import com.fruit.pojo.user.UserReal;
import lombok.Data;

import java.io.Serializable;
import java.util.Map;

/**
 * 钱包SDK
 *
 * @author joe
 */
public interface AccountManager {
    /**
     * 实名认证快速通道最大数
     */
    int MAXCERT = 2;

    /**
     * 获取指定用户的钱包
     *
     * @param uid 用户id
     * @return 用户钱包，包含佣金和余额
     */
    Account getUserAccount(long uid);

    /**
     * 查询指定月份账单或明细
     *
     * @param date     指定月份，格式为：yyyy-MM，传入空值或者不传表示查询所有
     * @param uid      用户id
     * @param pageNo   分页页码，从0开始
     * @param size     分页大小
     * @param isDetail 是否是查询明细，true为查询明细，false为查询账单
     * @return 指定月份账单或者明细
     */
    Page<Commission> getBill(String date, long uid, int pageNo, int size, boolean isDetail);

    /**
     * 查询账单详情
     *
     * @param id  流水ID
     * @param uid 用户ID
     * @return 账单详情
     */
    Commission getCommission(long id, long uid);


    /**
     * 查询用户实名认证状态
     *
     * @param uid 用户ID
     * @return 返回用户实名认证的记录，没有返回null
     */
    UserReal isReal(long uid);

    /**
     * 申请实名认证
     *
     * @param uid      用户id
     * @param name     真实姓名
     * @param idcard   身份证号
     * @param type     身份证类型，00表示二代身份证，01表示临时身份证
     * @param imgFront 身份证人像面照片URL
     * @param imgCon   身份证国徽面照片URL
     * @param code     短信验证码
     * @return 返回0表示申请成功，返回1表示验证码错误，返回2表示参数错误，返回3表示身份证已经有人使用，返回4表示用户
     * 已经申请实名认证
     */
    int applyCertification(long uid, String name, String idcard, String type, String imgFront, String imgCon,
                           String code);

    /**
     * 申请实名认证
     *
     * @param uid  用户UID
     * @param card 身份证号
     * @param name 真实姓名
     * @param code 验证码
     * @return 返回0表示认证成功，返回1表示认证失败，返回2表示当前实名认证次数过多，请走人工通道，返回3表示参数错误
     * 返回4表示用户已经申请实名认证，返回5表示验证码错误，返回6表示身份证有人使用
     */
    int applyCert(long uid, String card, String name, String code);

    /**
     * 获取提现申请验证码
     *
     * @param uid 用户ID
     * @return 获取结果（具体结果未知，请参照对应的服务）
     */
    Map<String, Object> sendCashApplySms(long uid);

    /**
     * 获取实名认证验证码
     *
     * @param uid 用户ID
     * @return 获取结果（具体结果未知，请参照对应的服务）
     */
    Map<String, Object> sendCertApply(long uid);

    /**
     * 获取实名认证人工通道验证码
     *
     * @param uid 用户ID
     * @return 获取结果（具体结果未知，请参照对应的服务）
     */
    Map<String, Object> sendCertApplyByHuman(long uid);

    /**
     * 根据用户UID获取手机号
     *
     * @param uid 用户UID
     * @return 手机号，可能是null
     */
    String getPhone(long uid);

    /**
     * 获取真实姓名
     *
     * @param uid  用户UID
     * @param blur 是否模糊处理，true为模糊处理，false为不模糊处理
     * @return 用户真实姓名
     */
    String getRealName(long uid, boolean blur);

    /**
     * 获取提现配置
     *
     * @return 提现配置
     */
    CashRuleDTO getMinCashout();

    /**
     * 检查用户实名认证状态
     *
     * @param userReal 用户实名认证状态
     * @return 返回1表示未申请认证，返回2表示申请认证未审核，返回3表示实名认证审核未通过，返回4表示实名认证审
     * 核已通过，返回5表示未知状态
     */
    int checkUserReal(UserReal userReal);

    /**
     * 提现申请
     *
     * @param uid            用户ID
     * @param price          提现金额
     * @param cash_mode      提现方式，00银行卡，01支付宝
     * @param alipay_account 支付宝账户
     * @param bank_card      银行卡号
     * @param bank_name      银行卡号
     * @param code           验证码
     * @return 申请状态，返回0成功，返回1参数错误，返回2当前不支持提现（没有相关的系统配置），返回3表示提
     * 现金额小于系统允许最小提现金额，返回4表示用户钱包余额不足，返回5表示验证码错误，返回6表示未实名认证，返回7表示验
     * 证码失效
     */
    int cashApply(long uid, double price, String cash_mode, String alipay_account, String
            bank_card, String bank_name, String code);

    @Data
    class Account implements Serializable {
        private static final long serialVersionUID = 1L;
        //用户ID
        private int userId;
        //余额，单位元
        private String balance;
    }

    /**
     * 提现账单
     */
    @Data
    class CashOut extends Commission {
        private static final long serialVersionUID = 1L;
        //手续费（提现中有）
        private String poundage;
        //提现状态，00审核中，01审核通过，02拒绝
        private String status;
        //提现账户，例如：支付宝（******135）
        private String account;
    }

    /**
     * 消费账单
     */
    @Data
    class Consume extends Commission {
        private static final long serialVersionUID = 1L;
        //付款方式，例如：支付宝、微信
        private String payMode;
    }

    /**
     * 返现账单
     */
    @Data
    class CashBack extends Commission {
        private static final long serialVersionUID = 1L;
        //付款方，邀请好友奖励中有，例如：果犇农业科技（北京）有限公司
        private String payCompany;
        //邀请的好友，例如：185****3438
        private String friend;
    }

    /**
     * 用户账单、明细详情列表（是余额明细详情时其中的收益状态等需要重新设置，字段名与流水表中不一样）
     */
    @Data
    class Commission extends Order {
        private static final long serialVersionUID = 1L;
        //交易单号
        private String code;
        //账单说明（消费中是商品说明），例如：邀请好友奖励
        private String remark;
        //真实时间（不会被处理为今天、明天）
        private String realTime;
        //账单状态，只有关闭订单和提现处理中
        private String state;
    }

    /**
     * 账单列表页、明细列表页使用
     */
    @Data
    class Order implements Serializable {
        private static final long serialVersionUID = 1L;
        //流水ID
        private Long id;
        //创建时间，格式：yyyy-MM-dd HH:mm:ss
        private String createTime;
        //实际的分类，例如00,01
        private String type;
        //账单分类，例如：账户提现
        private String typePrint;
        //用户ID
        private Long userId;
        //金额，单位元
        private String totalPrice;
        //收益状态，01：增加 ； 00：减少
        private String priceState;
        //列表页的标题
        private String title;
        //账单详情金额下方的说明，例如：领取成功、付款成功、审核中
        private String descript;
        //余额，该字段只在余额明细列表页使用
        private String balance;
    }

    @Data
    class CashRuleDTO implements Serializable {
        //最小提现金额
        private String min;
        //提现比例（0.01就是1%）
        private double cashRatio;
    }
}
